#include <iostream>
#include <sys/socket.h> //引入socket库
#include <netinet/in.h> //引入Internet地址族
#include <unistd.h> 
#include <cstring>  //引入自然村操作库，用于 memset()
int main() 
{
    int server_fd, new_socket;  //声明服务器 socket 和新客户端socket
    struct sockaddr_in address; //声明用于储存地址信息的结构体
    int opt = 1;  //设置选项
    int addrlen = sizeof(address);  //设置结构体大小 
    const int PORT = 8080; // 服务器监听的端口

    //第一步：建立socket
    //创建socket
    server_fd = socket(AF_INET,SOCK_STREAM,0); //ipv4的tcp协议 流式 
    if(server_fd == -1) 
    {
        std::cout << "Socket creatiion failed" << std::endl;
        return 1;
    }
    //设置socket选项，允许重用地址(可要可不要)
    setsockopt(server_fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
    //设置服务器地址信息
    address.sin_family = AF_INET; //使用IPV4地址族
    address.sin_addr.s_addr =INADDR_ANY;  //允许接受来自任何ip地址连接
    address.sin_port = htons(PORT);  //设置监听的端口号

    //第二步：绑定
    //将socket 绑定指定地址和端口
    if(bind(server_fd,(struct sockaddr*)&address,sizeof(address)) < 0) 
    {
        std::cout << "Bind failed" << std::endl;
        return 1;
    }
     //第三步：监听
     //开始监听传入的连接请求，队列长度为3
     if(listen(server_fd,3) < 0) 
     {
         std::cout <<"Listen failed"<< std::endl;
         return 1;
     }
     std::cout << "Server is listening on port" << PORT << "..." <<std::endl;//输出服务器监听
     //无限循环
     while(true) 
     {
         //第四步：接收
         //接收客户端的连接请求
         new_socket = accept(server_fd,(struct sockaddr*)&address,(socklen_t*)&addrlen);
         if(new_socket == -1) 
         {
             std::cout <<"Accept failed" << std::endl;
             continue;
         }
        // 接收客户端的发送信息
        char buffer[1024] = {0}; //创建缓冲区
        //第五步：读取信息
        ssize_t bytes_read =  recv(new_socket,buffer,sizeof(buffer),0); //接受数据
        if(bytes_read > 0) 
        {
            std::cout << "Clinet:" << buffer << std::endl; //输出客户端发送的信息
            //发送响应消息给客户端
            const char* message = "Hello from server"; //响应消息
            //第六步：发送信息
            send(new_socket,message,strlen(message),0); //发送数据
        }
        //关闭与客户端的连接
        close(new_socket);
     }
     //关闭服务器
     close(server_fd);
     return 0;
}
